/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gra.Renderer;

import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import static org.lwjgl.opengl.GL11.*;
import org.lwjgl.util.glu.GLU;
import org.lwjgl.util.vector.Vector3f;

/**
 *
 * @author Aneta
 */
public class KameraFPP {
    
    Vector3f pozycja = new Vector3f();
    Vector3f rotacja = new Vector3f();
    private float szybkosc = 30f;
    
    
    protected float fov = 90;
    protected float aspectRatio;
    protected float zNear = 0.3f;
    protected float zFar = 100000f;

    public KameraFPP(float aspectRatio, float x, float y, float z) {
        this.aspectRatio = aspectRatio;
        this.pozycja.x = x;
        this.pozycja.y = y;
        this.pozycja.z = z;
    }
    
    private void obslugaInput (float szybkosc, int delta){
       
        boolean keyUp = Keyboard.isKeyDown(Keyboard.KEY_UP) || Keyboard.isKeyDown(Keyboard.KEY_W);
        boolean keyDown = Keyboard.isKeyDown(Keyboard.KEY_DOWN) || Keyboard.isKeyDown(Keyboard.KEY_S);
        boolean keyLeft = Keyboard.isKeyDown(Keyboard.KEY_LEFT) || Keyboard.isKeyDown(Keyboard.KEY_A);
        boolean keyRight = Keyboard.isKeyDown(Keyboard.KEY_RIGHT) || Keyboard.isKeyDown(Keyboard.KEY_D);
        boolean flyUp = Keyboard.isKeyDown(Keyboard.KEY_RSHIFT);
        boolean flyDown = Keyboard.isKeyDown(Keyboard.KEY_RCONTROL);
        

                if (keyUp && keyRight && !keyLeft && !keyDown) {
                float angle = rotacja.y + 45;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyUp && keyLeft && !keyRight && !keyDown) {
                float angle = rotacja.y - 45;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyUp && !keyLeft && !keyRight && !keyDown) {
                float angle = rotacja.y;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyDown && keyLeft && !keyRight && !keyUp) {
                float angle = rotacja.y - 135;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyDown && keyRight && !keyLeft && !keyUp) {
                float angle = rotacja.y + 135;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyDown && !keyUp && !keyLeft && !keyRight) {
                float angle = rotacja.y;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = -(szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyLeft && !keyRight && !keyUp && !keyDown) {
                float angle = rotacja.y - 90;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (keyRight && !keyLeft && !keyUp && !keyDown) {
                float angle = rotacja.y + 90;
                Vector3f newPosition = new Vector3f(pozycja);
                float schuine = (szybkosc * 0.0002f) * delta;
                float aanliggende = schuine * (float) Math.cos(Math.toRadians(angle));
                float overstaande = (float) (Math.sin(Math.toRadians(angle)) * schuine);
                newPosition.z += aanliggende;
                newPosition.x -= overstaande;
                pozycja.z = newPosition.z;
                pozycja.x = newPosition.x;
            }
            if (flyUp && !flyDown) {
                double newPositionY = (szybkosc * 0.0002) * delta;
                pozycja.y -= newPositionY;
            }
            if (flyDown && !flyUp) {
                double newPositionY = (szybkosc * 0.0002) * delta;
                pozycja.y += newPositionY;
            }
                
           if (!Mouse.isGrabbed()) {
            return;
        }     
                
       float mouseDX = Mouse.getDX() * 1 * 0.15f;
        float mouseDY = Mouse.getDY() * 1 * 0.15f;
        
        if (rotacja.y + mouseDX >= 360) {
            rotacja.y = rotacja.y + mouseDX - 360;
            
        } else if (rotacja.y + mouseDX < 0) {
            rotacja.y = 360 - rotacja.y + mouseDX;
        } else {
            rotacja.y += mouseDX;
        }
        
        if (rotacja.x + mouseDY <= 80) {
            rotacja.x -= mouseDY;
        } else if (rotacja.x - mouseDY < -80) {
            rotacja.x = -80;
        } else if (rotacja.x - mouseDY > 80) {
            rotacja.x = 80;
        }          
                
                
    } 
        
        
    
    public void zastosujDoModelviewMatrix(boolean resetMatrix) {
        if (resetMatrix) {
            glLoadIdentity();
        }
        
        glRotatef(rotacja.x, 1, 0, 0);
        glRotatef(rotacja.y, 0, 1, 0);
        glRotatef(rotacja.z, 0, 0, 1);
        glTranslatef(pozycja.x, pozycja.y, pozycja.z);
        
    }
    
    public void obslugaKamery(int delta){
           obslugaInput(getSzybkosc(), delta);
           zastosujDoModelviewMatrix(true);
           
    }

    void setFov(int fov) {
        this.fov = fov;
    }

   public void applyProjectionMatrix() {
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        GLU.gluPerspective(fov, aspectRatio, zNear, zFar);
        glMatrixMode(GL_MODELVIEW);
    
    }

    /**
     * @return the szybkosc
     */
    public float getSzybkosc() {
        return szybkosc;
    }

    /**
     * @param szybkosc the szybkosc to set
     */
    public void setSzybkosc(float szybkosc) {
        this.szybkosc = szybkosc;
    }
   
   
   
    
    
    
    
    
    
    
    
}
